/**
 数组：
 作用：存储多个数据
 特点：
 1. 可以存储多个数据
 2. 一个数组当中只能存储数据相同的数据，我们创建的时候指定的
 3. 数组中可以存储的数据的个数是固定的，使我们在创建的时候指定的
 4. 存储在数组中的数据方便管理
 
 语法：
 储存的数据数据的类型 数组名称[这个数组最多可以存储多少个数据]
 int array[5]
 
 元素：数组中的每一个小空间，就叫做元素
 下标/索引：数组中每个元素所在的位置，从0开始
 长度：数组中最多存储的元素的个数
 
 存储数据：
 语法：数组名[索引] = {数据};
 arr[0] = 100;
 注意：
 1. 类型要一致
 2. 下边不能越界
 
 取数组值：
 数组名[索引]

 
 数组初始化：
 数组元素默认值：
 当我们声明一个数组，没有为数组的元素赋值，那么这个数组元素是有值得， 值是垃圾值。
 在声明数组的同时就声明
 int len = 3;
 int arr[len] = {10, 20, 30};
 在编译的时候，无法无法确定数组的长度，这个时候赋值可能会越界
 所以为了保证一定不会出错，干脆这种方式初始化的时候不允许使用变量来表示长度。
 但是使用宏是可以的，宏在编译的时候就确定了
 int [] = {1,1,1,1,,1,1,2,2,,23,3,4,4,,5,5,6,6,7,7,7,7};
 
 int arr[3] = {10}; => arr[3]={10, 0, 0};
 
 int arr[3] = {[0=10, [2]=20]};
 其他的元素都初始化为0；
 
 
 一、变量在内存中存储的方式
 1. 不同类型的变量在内存中占据不同的字节数，一个变量占用的字节一定是连续的
 2. 在为变量分配字节空间的时候，是从搞地质想低地址分配的连续空间，先声明的变量是咋高字节，后声明的变量是在低字节
 3. 任何数据在内存中都是以其二进制的补码存储的，低位存储在低字节，高位存储在高字节
 4. 每一个字节在内存中都有一个地址，十六进制。变量地址：是组成这个变量的低字节的地址
 5. 使用 & 取地址运算符直接拿到变量地址
 6. 使用%p打印地址类型的数据
 
 二、数组在内存中存储的方式
 1. 声明一个数组，在内存中，从高字节想低字节申请连续的（数组的长度*每一个元素的字节数）字节的空间。
 2. 下表为0的元素在低字节
 3. 元素的值还是按照之前那样 存储的是 数据的二进制的补码
 4. 数组的元素的本质是1个普通类型的变量，1个数组就是有多个普通类型的变量联合而成。每一个元素就是1个普通变量，所以每1个元素也有自己的地址
 
 三、数组的地址：组成数组中最低的地址，也就是：下标为0的元素字节地址，数组名中存的是数组地址
 数组地址 == 数组名 == 数组中的低字节的地址 == 数组中下标为0的元素的地址 == 数组中下标为0的元素的低字节地址
 
 四、数组长度计算
 sizeof(数组名) / sizeof(元素数据类型)

 */

#include <stdio.h>
void testArray(int arr[], int len);

int main(int argc, const char * argv[]) {
    
//    int count = 5;
//    int arr[count];
//    for (int i = 0; i < count; i ++) {
//        arr[i] = i+11;
//    }
//    
//    for (int i = 0; i < count; i ++) {
//        printf("%d\n", arr[i]);
//    }
    
//    double arr[5];
//    for (int i = 0; i < 5; i ++) {
//        printf("请输入第%d个同学的成绩:", i+1);
//        scanf("%lf", &arr[i]);
//    }
//    for(int i = 0; i < 5; i++) {
//        double sorce = arr[i];
//        printf("第%d个同学的成绩是%.2lf\n", i+1, sorce);
//        if (sorce < 60) {
//            sorce += 5;
//            arr[i] = sorce;
//        }
//    }
//    
//    for(int i = 0; i < 5; i++) {
//        double sorce = arr[i];
//        printf("第%d个同学的成绩是%.2lf\n", i+1, sorce);
//    }
    
    
    int array[5] = {102, 223, 444, 55, 5566};
    int len = sizeof(array) / sizeof(array[0]);
    testArray(array, len);
    
    return 0;
}

// 数组作为函数参数
// 如果函数的参数是一个数组，这个时候，必须加一个参数（数组的长度）
//  当函数的参数是一个数组的时候，传递的是实参数组的地址，所以形参数组指针指向了实参数组的地址。
void testArray(int arr[], int len) {
    for (int i = 0; i < len; i ++) {
        printf("%d\n", arr[i]);
    }
}
